/**
 * File:   Joueur.hpp
 * Author: CHABOT DIEP MYCEK
 *
 */

#include <iostream>
#include <string>
#include <sstream>
#include <string.h>
#include "Joueur.hpp"
#include "GrilleMotsCroises.hpp"

using namespace std;

Joueur::Joueur(const GrilleMotsCroises& grille){
	grilleJ = new GrilleMotsCroises(grille,false);
	grilleSol = new GrilleMotsCroises(grille,true);
}

Joueur::~Joueur(){
	delete grilleJ;
}

void Joueur::jouer(){
	int rep = 3;
	bool gagne = false;
	while(rep != 0 && !gagne){
		if(!(rep>=0 && rep<=6)){
			ihm.ecrire<string>("Reponse inapropriee\n");
		}
		if(rep != 0){
			int ok;
			switch(rep){
				case 1 : ok = proposerLettre(); break;
				case 2 : ok = proposerMot(); break;
				case 3 : afficherGrille(); break;
				case 4 : ok = effacerLettre(); break;
				case 5 : gagne = comparerGrilles(true); break;
				case 6 : grilleSol->afficher(true); break;
				default : break;
			}
			//si on a ajoute une lettre ou un mot et que la grille est remplie, on verifie si la partie est gagnee
			if((rep == 1 || rep == 2) && grilleJ->estRemplie() && ok == 1){
				gagne = comparerGrilles(false);
			}
			//si c'est gagne
			if(gagne){
				afficherGrille(false);
				ihm.ecrire<string>("\n****************************\n* BRAVO VOUS AVEZ GAGNE !! *\n****************************\n\n");
			}
			//sinon on continue
			else{
				if(rep != 3 && rep != 6 && ok == 1) afficherGrille();
				//si on n'a pas demande a voir la solution
				rep = ihm.demander<int>("[1] Proposer une lettre - [2] Proposer un mot - [3] Afficher la grille et les definitions\n[4] Effacer une lettre - [5] Verifier ma grille - [6] Voir la solution - [0] Quitter\nQue faire ?\n");
			}
		}
	}
}

void Joueur::afficherGrille(bool affDef){
	ihm.sautLigne(2);
	grilleJ->afficher(true);
	if(affDef) grilleJ->afficherDef();
}

bool Joueur::comparerGrilles(bool afficheDiff){
	bool retour = true;
	int haut = grilleJ->getHauteur();
	int lg = grilleJ->getLongueur();
	
	for(int i=0; i< haut; i++){
		for(int j=0; j<lg; j++){
			if(grilleJ->getContenu(i, j) != grilleSol->getContenu(i, j)){
				if(afficheDiff){
					grilleJ->setContenu(i, j, '%');
				}
				retour = false;
			}
		}
	}
	if(!retour && afficheDiff){
		ihm.ecrire<string>("Les cases erronees ont ete remplacees par des cases vides.\n");
	}
	return retour;
}

int Joueur::proposerLettre(){
	int x, y;
	ostringstream ligne;
	ostringstream colonne;
	int lg = grilleJ->getLongueur();
	int haut = grilleJ->getHauteur();
	ligne << "Choisissez une ligne (entre 1 et " << haut << ")\n";
	colonne << "Choisissez une colonne (entre A et " << (lg<26?"":"A") << (lg<26?(char)('A'+lg-1):(char)('A'+lg-27)) << ")\n";
	do{
		x = ihm.demander<int>((ligne.str()).c_str()) -1;
		if(x<0 || x>=haut) ihm.ecrire<string>("Reponse inapropriee\n");
	}while(x<0 || x>=haut);
	
	do{
		string repColonne = ihm.demander<string>((colonne.str()).c_str());
		y=traduireColonne(repColonne);
		if(y<0 || y>=lg) ihm.ecrire<string>("Reponse inapropriee\n");
	}while(y<0 || y>=lg);
	
	char c;
	do{
		c = ihm.demander<char>("Proposez une lettre : \n");
		if(!(c>='a' && c<='z' || c>='A' && c<='Z')) ihm.ecrire<string>("Ce n'est pas une lettre !\n");
	}while(!(c>='a' && c<='z' || c>='A' && c<='Z'));
	
	return grilleJ->proposerLettre(x,y,c);
}

int Joueur::traduireColonne(string col){
	if(col.length()==2){
		//si la premiere lettre n'est pas A ou si le deuxieme caractere n'est pas une lettre
		if(col[0] != 'A' || col[0] != 'a' || !(col[1]>='A' && col[1]<='Z' || col[1]>='a' && col[1]<='z'))
			return -1;
		else
			return 26 + ihm.toMaj(col[1])-'A';
	}
	else if(col.length()==1){
		//si le caractere n'est pas une lettre
		if(!(col[0]>='A' && col[0]<='Z' || col[0]>='a' && col[0]<='z'))
			return -1;
		else return ihm.toMaj(col[0])-'A';
	}
	else return -1;
}

int Joueur::effacerLettre(){

}

int Joueur::proposerMot(){
	ihm.ecrire<string>("Vous pouvez proposer un mot entier ou une suite de caracteres.\n");
	int x, y;
	ostringstream ligne;
	ostringstream colonne;
	int lg = grilleJ->getLongueur();
	int haut = grilleJ->getHauteur();
	ligne << "Choisissez une ligne (entre 1 et " << haut << ")\n";
	colonne << "Choisissez une colonne (entre A et " << (lg<26?"":"A") << (lg<26?(char)('A'+lg-1):(char)('A'+lg-27)) << ")\n";
	do{
		x = ihm.demander<int>((ligne.str()).c_str()) -1;
		if(x<0 || x>=haut) ihm.ecrire<string>("Reponse inapropriee\n");
	}while(x<0 || x>=haut);
	
	do{
		string repColonne = ihm.demander<string>(colonne.str());
		y=traduireColonne(repColonne);
		if(y<0 || y>=lg) ihm.ecrire<string>("Reponse inapropriee\n");
	}while(y<0 || y>=lg);
	
	char c;
	do{
		c = ihm.toMaj(ihm.demander<char>("Mot [v]ertical ou [h]orizontal ?\n"));
		if(c!='V' && c!='H') ihm.ecrire<string>("Reponse inapropriee\n");
	}while(c!='V' && c!='H');
	
	bool v = (c=='V'?true:false);
	
	string mot = ihm.demander<string>("Proposez une chaine de caracteres : \n");
	bool ok = true;
	for(int i=0; i<mot.length(); i++){
		if(!(mot[i]>='a' && mot[i]<='z' || mot[i]>='A' && mot[i]<='Z')){
			ihm.ecrire<string>("Chaine de caracteres non valide\n");
			ok = false;
		}
	}
	if(ok) return grilleJ->proposerMot(x,y,mot.c_str(),v);
	else return 0;
}
